package com.itheima.controller;

import com.alibaba.excel.EasyExcel;
import com.itheima.pojo.Emp;
import com.itheima.pojo.EmpTemplate;
import com.itheima.pojo.Emprole;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import com.itheima.service.EmpService;
import com.itheima.service.EmproleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class EmpExcelController {

    // 注入员工服务，用于操作数据库中的员工数据
    @Autowired
    private EmpService empService;
    @Autowired
    private DeptService deptService;
    @Autowired
    private EmproleService emproleService;

    /**
     * 下载员工模板
     * 这个方法用于下载一个 Excel 文件，作为上传员工数据时的模板。
     * 模板文件包含了样本数据或为空模板，用户可以按照模板填充数据并上传。
     */
    @GetMapping("/downloadEmpTemplate")
    public ResponseEntity<Object> downloadTemplate(HttpServletResponse response) throws IOException {
        // 设置响应头，指定文件类型为 Excel，并指定文件名
        response.setContentType("application/vnd.ms-excel");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=emp_template.xlsx");

        // 模拟一些示例数据，通常这个数据可以为空，或者是一些简单的字段示例
        List<EmpTemplate> templateData = Arrays.asList(
//                new EmpTemplate("张三", "password123", "13800138000", "EMP001", "photo_url", 1, "IT", "2020-01-01", "2021-01-01", 30, "本科")
        );

        // 使用 EasyExcel 写入模板数据到响应输出流，生成 Excel 文件
        EasyExcel.write(response.getOutputStream(), EmpTemplate.class)
                .sheet("员工模板")
                .doWrite(templateData); // 写入模板数据

        // 返回状态码 200，表示文件已成功下载
        return ResponseEntity.status(HttpStatus.OK).build();
    }

    /**
     * 导出员工数据
     * 这个方法用于将数据库中的员工数据导出为 Excel 文件。
     * 用户可以下载这个文件进行查看或进一步操作。
     */
    @GetMapping("/exportEmpData")
    public ResponseEntity<Object> exportEmpData(HttpServletResponse response) throws IOException {
        // 设置响应头，指定文件类型为 Excel，并指定文件名
        response.setContentType("application/vnd.ms-excel");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=emp_data.xlsx");

        // 从数据库中获取所有员工数据
        List<Emp> employeeData = empService.list();

        // 将查询到的员工数据转换为 EmpTemplate 格式，这样可以方便 EasyExcel 导出
        List<EmpTemplate> empData = employeeData.stream()
                .map(employee -> new EmpTemplate(
                        employee.getUsername(),
                        employee.getPassword(),
                        employee.getMobile(),
                        employee.getWorkNumber(),
                        employee.getStaffPhoto(),
                        employee.getFormOfEmployment(),
                        employee.getDepartmentName(),
                        employee.getTimeofentry(),
                        employee.getCorrectionTime(),
                        employee.getAge(),
                        employee.getEducation()
                ))
                .collect(Collectors.toList());

        // 使用 EasyExcel 写入员工数据到响应输出流，生成 Excel 文件
        EasyExcel.write(response.getOutputStream(), EmpTemplate.class)
                .sheet("员工数据")  // 工作表名称
                .doWrite(empData);  // 写入员工数据

        // 返回状态码 200，表示文件已成功生成并准备下载
        return ResponseEntity.status(HttpStatus.OK).build();
    }

    /**
     * 导入员工数据
     * 该方法处理文件上传，解析 Excel 文件中的员工数据，并将其存储到数据库中。
     * 成功导入数据后，返回一个成功消息；如果导入过程中发生异常，返回错误消息。
     */
    @PostMapping("/importEmpData")
    public Result<Object> importEmpData(@RequestParam("file") MultipartFile file) throws IOException {
        try {
            // 解析上传的 Excel 文件，使用 EasyExcel 将文件内容映射为 EmpTemplate 对象列表
            List<EmpTemplate> empData = EasyExcel.read(file.getInputStream())
                    .head(EmpTemplate.class)
                    .sheet()
                    .doReadSync();
            List<Emp> employeeList = empData.stream().map(empTemplate -> {
                Integer departmentId = deptService.findDepartmentIdByName(empTemplate.getDepartmentName());
                // 将 Excel 中的 EmpTemplate 数据转换为 Emp 对象
                Emp emp = new Emp(
                        empTemplate.getUsername(),
                        empTemplate.getPassword(),
                        empTemplate.getMobile(),
                        empTemplate.getWorkNumber(),
                        empTemplate.getStaffPhoto(),
                        empTemplate.getFormOfEmployment(),
                        empTemplate.getDepartmentName(),
                        empTemplate.getTimeofentry(),
                        empTemplate.getCorrectionTime(),
                        empTemplate.getAge(),
                        empTemplate.getEducation()
                );
                emp.setDepartmentId(departmentId);
                return emp;
            }).collect(Collectors.toList());
            empService.saveBatch(employeeList);
            // 批量创建员工角色关联
            List<Emprole> employeeRoles = employeeList.stream().map(employee -> {
                return new Emprole(employee.getId(), 4); // 员工角色ID为1
            }).collect(Collectors.toList());

            // 批量保存员工角色关联
            emproleService.saveBatch(employeeRoles);
            // 返回导入成功的信息
            return Result.success("员工数据导入成功");
        } catch (Exception e) {
            // 如果导入过程中发生任何异常，捕获异常并返回错误信息
            return Result.error("导入失败: " + e.getMessage());
        }
    }

}
